home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / qbsnip.zip / KISSED.BAS < prev    next >
BASIC Source File  |  1997-05-04  |  25KB  |  998 lines

  1. '_|_|_|   KISSED.BAS
  2. '_|_|_|   Keep It Simple, Stupid EDitor  [ Qbasic / QuickBasic ]
  3. '_|_|_|   Released to the   PUBLIC DOMAIN   by Kurt Kuzba  (12/02/95)
  4.  
  5. DECLARE SUB DOCINIT (D%)
  6. DECLARE SUB DOCOPN (F$, D%)
  7. DECLARE SUB ALARM ()
  8. DECLARE SUB CHECKMARK (D%, SH%)
  9. DECLARE SUB CLIPBOARD ()
  10. DECLARE SUB SHOWDOC (D%)
  11. DECLARE SUB INFOBAR (D%)
  12. DECLARE SUB CUTTEXT (D%)
  13. DECLARE SUB ORDERMARK (D%, LA%, LZ%, CA%, CZ%)
  14. DECLARE SUB NOISE ()
  15. DECLARE SUB DELETETEXT (D%)
  16. DECLARE SUB PUTLINE (D%, T$)
  17. DECLARE FUNCTION DELLINE$ (D%)
  18. DECLARE SUB PARMSINIT (D%)
  19. DECLARE FUNCTION EDDOC% (D%)
  20. DECLARE SUB INSLINE (D%, S$)
  21. DECLARE SUB LINECAT (D%, L%)
  22. DECLARE SUB SAVEQRY (D%)
  23. DECLARE SUB LOADDOC (D%)
  24. DECLARE SUB SAVEDOC (D%)
  25. DECLARE SUB SETMARK (D%, SH%)
  26. DECLARE SUB PASTETEXT (D%)
  27. DECLARE SUB HELP ()
  28. DECLARE FUNCTION GETKEY% ()
  29. DECLARE FUNCTION GETLINE$ (D%)
  30. DECLARE FUNCTION GETSTR$ (P$, D$, M%)
  31. DECLARE FUNCTION MSG% (M$, P$)
  32. DECLARE SUB SHOWLINE (D%, L%, S%)
  33.  
  34.   CLEAR ' $DYNAMIC
  35.   TYPE TXT
  36.     L AS STRING * 80
  37.   END TYPE
  38.   TYPE PARMS
  39.     INS AS INTEGER
  40.     TOP AS INTEGER
  41.     LIN AS INTEGER
  42.     CRS AS INTEGER
  43.     TOT AS INTEGER
  44.     MLA AS INTEGER
  45.     MCA AS INTEGER
  46.     MLZ AS INTEGER
  47.     MCZ AS INTEGER
  48.     WID AS INTEGER
  49.   END TYPE
  50.   DIM SHARED D0(800) AS TXT
  51.   DIM SHARED D1(800) AS TXT
  52.   DIM SHARED D2(800) AS TXT
  53.   DIM SHARED CFG(3) AS PARMS
  54.   DIM SHARED DOC$(6)
  55.   DOC$(1) = COMMAND$
  56.   DOC$(2) = ""
  57.   DOCINIT 0
  58.   DOCINIT 1
  59.   DOCINIT 2
  60.   DOC$(4) = ""
  61.   DOC$(5) = "INS"
  62.   IF DOC$(1) <> "" THEN
  63.     DOCOPN DOC$(1), 1
  64.   ELSE
  65.     DOC$(1) = "text1.txt"
  66.   END IF
  67.   ED% = 1
  68.   WHILE ED% <> 0
  69.     ED% = EDDOC%(ED%)
  70.   WEND
  71.  
  72.   COLOR 2, 0
  73.   CLS
  74.   SYSTEM
  75. WHATTHE:
  76.   DOC$(3) = STR$(ERR)
  77. RESUME NEXT
  78.  
  79. REM $STATIC
  80. '
  81. SUB ALARM
  82.   FOR T% = 0 TO 25
  83.     SOUND 2200 + 2 * T%, .1
  84.     SOUND 2225 + T%, .05
  85.   NEXT
  86. END SUB
  87.  
  88. SUB CHECKMARK (D%, SH%)
  89.   IF SH% THEN
  90.     IF CFG(D%).MCA = 0 THEN
  91.       CFG(D%).MLA = CFG(D%).LIN
  92.       CFG(D%).MLZ = CFG(D%).LIN
  93.       CFG(D%).MCA = CFG(D%).CRS
  94.       CFG(D%).MCZ = CFG(D%).CRS
  95.     END IF
  96.    ELSE
  97.     CFG(D%).MCA = 0
  98.   END IF
  99. END SUB
  100.  
  101. SUB CLIPBOARD
  102.   CFG(0).LIN = 0
  103.   CFG(0).CRS = 1
  104.   K% = 0
  105.   DOC$(0) = "CLIPBOARD    [ESC] TO EXIT"
  106.   WHILE K% <> 27
  107.     L% = CFG(0).LIN
  108.     CFG(0).MCA = 1
  109.     CFG(0).MCZ = 80
  110.     CFG(0).MLA = L%
  111.     CFG(0).MLZ = L%
  112.     SHOWDOC 0
  113.     INFOBAR 0
  114.     K% = GETKEY%
  115.     SELECT CASE K%
  116.        CASE -71                                                   '__HOME*
  117.       CFG(0).LIN = 0
  118.       CFG(0).TOP = 0
  119.        CASE -79                                                    '__END*
  120.       L% = CFG(0).TOT - 23
  121.       IF L% < 0 THEN L% = 0
  122.       CFG(0).TOP = L%
  123.       CFG(0).LIN = CFG(0).TOT - 1
  124. CASE -73:
  125.       IF L% <> 0 THEN
  126.         C% = L% - 24
  127.         CFG(0).LIN = -C% * (C% >= 0)
  128.         C% = CFG(0).TOP - 24
  129.         CFG(0).TOP = -C% * (C% >= 0)
  130.       END IF
  131.        CASE -81                                              '__PAGE DOWN*
  132.       T% = CFG(D%).TOT - 1
  133.       P% = T% - 23
  134.       L% = L% + 24
  135.       IF L% <= (T% + 23) THEN
  136.         IF L% > T% THEN L% = T%
  137.         CFG(0).LIN = L%
  138.         L% = CFG(0).TOP + 24
  139.         IF L% > P% THEN L% = P%
  140.         CFG(0).TOP = -L% * (L% >= 0)
  141.       END IF
  142.        CASE -72                                                '__CRSR UP*
  143.       L% = L% - 1
  144.       IF L% >= 0 THEN
  145.         CFG(0).LIN = L%
  146.         IF CFG(0).TOP > L% THEN CFG(0).TOP = L%
  147.       END IF
  148.        CASE -80                                            '__CURSOR DOWN*
  149.       L% = L% + 1
  150.       IF L% < CFG(0).TOT THEN
  151.         CFG(0).LIN = L%
  152.         T% = CFG(0).TOP
  153.         IF L% > (T% + 23) THEN CFG(0).TOP = T% + 1
  154.       END IF
  155.     END SELECT
  156.   WEND
  157. END SUB
  158.  
  159. SUB CUTTEXT (D%)
  160.   IF CFG(D%).MCA = 0 THEN
  161.     T% = MSG%("No Text Marked", "")
  162.     EXIT SUB
  163.   END IF
  164.   ORDERMARK D%, LA%, LZ%, CA%, CZ%
  165.   DOCINIT 0
  166.   R% = CFG(D%).LIN
  167.   I% = LZ% - LA%
  168.   CFG(0).TOT = I% + 1
  169.   FOR L% = 0 TO I%
  170.     CFG(0).LIN = L%
  171.     CFG(D%).LIN = LA% + L%
  172.     T$ = GETLINE$(D%)
  173.     IF L% = I% THEN T$ = LEFT$(T$, CZ%)
  174.     IF L% = 0 THEN T$ = MID$(T$, CA%)
  175.     D0(L%).L = T$
  176.   NEXT
  177.   CFG(D%).LIN = R%
  178.   NOISE
  179. END SUB
  180.  
  181. SUB DELETETEXT (D%)
  182.   IF CFG(D%).MCA = 0 THEN
  183.     T% = MSG%("No Text Marked", "")
  184.     EXIT SUB
  185.   END IF
  186.   ORDERMARK D%, LA%, LZ%, CA%, CZ%
  187.   L% = LZ% - LA%
  188.   R% = LA%
  189.   CFG(D%).CRS = CA%
  190.   CFG(D%).MCA = 0
  191.   CFG(D%).LIN = LA%
  192.   T$ = MID$(LEFT$(" " + GETLINE$(D%), CA%), 2)
  193.   CFG(D%).LIN = LZ%
  194.   P$ = RTRIM$(MID$(GETLINE$(D%), CZ% + 1))
  195.   B$ = T$ + P$
  196.   IF LA% = LZ% THEN
  197.     IF B$ = "" THEN
  198.       B$ = DELLINE$(D%)
  199.     ELSE
  200.       PUTLINE D%, B$
  201.     END IF
  202.   END IF
  203.   IF LZ% > LA% THEN
  204.     IF P$ = "" THEN
  205.       LZ% = LZ% + 1
  206.      ELSE
  207.       PUTLINE D%, P$
  208.     END IF
  209.     IF T$ <> "" THEN
  210.       CFG(D%).LIN = LA%
  211.       LA% = LA% + 1
  212.       PUTLINE D%, T$
  213.     END IF
  214.   END IF
  215.   IF LA% < LZ% THEN
  216.     L% = LZ% - LA%
  217.     Z% = CFG(D%).TOT - L%
  218.     CFG(D%).TOT = Z%
  219.     FOR T% = LA% TO Z%
  220.       IF D% = 1 THEN D1(T%).L = D1(T% + L%).L
  221.       IF D% = 2 THEN D2(T%).L = D2(T% + L%).L
  222.     NEXT
  223.     FOR T% = Z% TO 799
  224.       IF D% = 1 THEN D1(T%).L = ""
  225.       IF D% = 2 THEN D2(T%).L = ""
  226.     NEXT
  227.   END IF
  228.   CFG(D%).LIN = R%
  229.   R% = R% - 1
  230.   IF CFG(D%).TOT < 0 THEN CFG(D%).TOT = 1
  231.   IF R% + 25 > CFG(D%).TOT THEN R% = CFG(D%).TOT - 24
  232.   CFG(D%).TOP = R% * -(R% >= 0)
  233.   NOISE
  234. END SUB
  235.  
  236. FUNCTION DELLINE$ (D%)
  237.   L% = CFG(D%).LIN
  238.   E% = CFG(D%).TOT - 1
  239.   IF D% = 1 THEN
  240.     DELLINE$ = RTRIM$(D1(CFG(1).LIN).L)
  241.     FOR T% = L% TO E% - 1
  242.       D1(T%).L = D1(T% + 1).L
  243.     NEXT
  244.     D1(E%).L = SPACE$(80)
  245.   END IF
  246.   IF D% = 2 THEN
  247.     DELLINE$ = RTRIM$(D2(CFG(2).LIN).L)
  248.     FOR T% = L% TO E% - 1
  249.       D2(T%).L = D2(T% + 1).L
  250.     NEXT
  251.     D2(E%).L = SPACE$(80)
  252.   END IF
  253.   CFG(D%).TOT = E% - (E% = L%)
  254.   SHOWDOC D%
  255. END FUNCTION
  256.  
  257. SUB DOCINIT (D%)
  258.   FOR T% = 0 TO 799
  259.     IF D% = 0 THEN D0(T%).L = ""
  260.     IF D% = 1 THEN D1(T%).L = ""
  261.     IF D% = 2 THEN D2(T%).L = ""
  262.   NEXT
  263.   PARMSINIT D%
  264. END SUB
  265.  
  266. SUB DOCOPN (F$, D%)
  267.   ON ERROR GOTO WHATTHE
  268.   T% = 1
  269.   DOC$(3) = "ok"
  270.   IF F$ <> "" THEN OPEN F$ FOR INPUT AS #1
  271.   T$ = "File Error :: " + F$ + " :: Hit a Key"
  272.   IF DOC$(3) <> "ok" THEN
  273.     T% = MSG%(T$, "")
  274.     EXIT SUB
  275.   END IF
  276.   WHILE T% = 1
  277.     L% = 0
  278.     DOCINIT D%
  279.     WHILE ((L% < 800) AND (NOT EOF(1)))
  280.       LINE INPUT #1, P$
  281.       P$ = RTRIM$(P$)
  282.       CFG(D%).LIN = L%
  283.       WHILE INSTR(P$, CHR$(9)) <> 0
  284.         P% = INSTR(P$, CHR$(9))
  285.         T$ = MID$(P$, P% + 1)
  286.         T$ = "   " + T$
  287.         IF P% > 1 THEN T$ = LEFT$(P$, P% - 1) + T$
  288.         P$ = T$
  289.       WEND
  290.       IF LEN(P$) > 79 THEN
  291.         IF L% < 799 THEN
  292.           PUTLINE D%, LEFT$(P$, 79)
  293.           P$ = MID$(P$, 80)
  294.           L% = L% + 1
  295.           CFG(D%).LIN = L%
  296.         END IF
  297.         P$ = LEFT$(P$, 79)
  298.       END IF
  299.       PUTLINE D%, P$
  300.       L% = L% + 1
  301.     WEND
  302.     T$ = "File too large. Load next section (Y/N)?"
  303.     IF (NOT EOF(1)) THEN
  304.       T% = MSG%(T$, "yn")
  305.      ELSE
  306.       T% = 0
  307.     END IF
  308.   WEND
  309.   CLOSE 1
  310.   CFG(D%).TOT = L%
  311.   CFG(D%).LIN = 0
  312.   ALARM
  313.   DOC$(D%) = UCASE$(F$)
  314. END SUB
  315.  
  316. FUNCTION EDDOC% (D%)
  317.   DEF SEG = 0
  318.   EDDOC% = D%
  319.   IF D% = 0 THEN GOTO CYCLE
  320.   SHOWDOC D%
  321.   EDIT$ = "YES"
  322.   S$ = SPACE$(80)
  323.   WHILE EDIT$ = "YES"
  324.     T$ = GETLINE$(D%) + S$
  325.     L% = CFG(D%).LIN
  326.     C% = CFG(D%).CRS
  327.     SHOWDOC D%
  328.     INFOBAR D%
  329.     LOCATE L% - CFG(D%).TOP + 2, C%, 1, 13 * CFG(D%).INS, 13
  330.     K% = GETKEY%
  331.     SH% = ((PEEK(&H417) AND 3) <> 0)
  332.     W% = CFG(D%).WID
  333.     IF K% = 9 THEN
  334.       T$ = LEFT$(T$, C% - 1) + SPACE$(9) + MID$(T$, C%)
  335.       K% = 32
  336.       C% = C% + 9
  337.     END IF
  338.     SELECT CASE K%
  339.      CASE 32 TO 254                                               '__TEXT*
  340.       IF CFG(D%).INS <> 0 THEN MID$(T$, C% + 1) = MID$(T$, C%)
  341.       MID$(T$, C%) = CHR$(K%)
  342.       T$ = RTRIM$(T$)
  343.       IF (LEN(T$) > W%) THEN
  344.         P$ = MID$(T$, W% + 1)
  345.         T$ = LEFT$(T$, W%)
  346.         T% = 0
  347.         WHILE T% = 0
  348.           R$ = RIGHT$(T$, 1)
  349.           L% = LEN(T$)
  350.           T% = INSTR("*+\]}:)/- ", R$) - (L% < (W% * .75))
  351.           IF T% = 0 THEN
  352.             P$ = R$ + P$
  353.             T$ = LEFT$(T$, L% - 1)
  354.           END IF
  355.         WEND
  356.         PUTLINE D%, T$
  357.         L% = CFG(D%).LIN
  358.         T% = LEN(T$)
  359.         IF L% < 799 THEN
  360.           CFG(D%).LIN = L% + 1
  361.           INSLINE D%, P$
  362.         END IF
  363.         IF C% > W% AND L% < 799 THEN
  364.           C% = C% - T%
  365.           L% = L% + 1
  366.         END IF
  367.         CFG(D%).LIN = L%
  368.         IF C% > W% AND L% > 788 THEN C% = T%
  369.        ELSE
  370.         PUTLINE D%, T$
  371.       END IF
  372.       CFG(D%).CRS = C% + 1
  373.      CASE 8                                                  '__BACKSPACE*
  374.       L% = CFG(D%).LIN
  375.       T% = LEN(RTRIM$(T$))
  376.       IF (C% = 1) AND (L% = 0) THEN GOTO CYCLE
  377.       IF C% > 1 THEN
  378.         IF T% <> 0 THEN MID$(T$, C% - 1) = MID$(T$, C%) + " "
  379.         CFG(D%).CRS = C% - 1
  380.         PUTLINE D%, T$
  381.        ELSE
  382.         LINECAT D%, L% - 1
  383.       END IF
  384.        CASE -83                                                 '__DELETE*
  385.       T% = LEN(RTRIM$(T$))
  386.       IF C% <= T% THEN
  387.         MID$(T$, C%) = MID$(T$, C% + 1) + " "
  388.         PUTLINE D%, T$
  389.        ELSE
  390.         LINECAT D%, CFG(D%).LIN
  391.       END IF
  392.        CASE -82                                                 '__INSERT*
  393.       T$ = DOC$(6)
  394.       IF SH% THEN
  395.         IF T$ <> "" THEN
  396.           INSLINE D%, T$
  397.           CFG(D%).CRS = 1
  398.         END IF
  399.        ELSE
  400.         CFG(D%).INS = ABS(CFG(D%).INS - 1)
  401.         NOISE
  402.       END IF
  403.      CASE 13                                                     '__ENTER*
  404.       L% = CFG(D%).LIN
  405.       IF L% >= 799 THEN GOTO CYCLE
  406.       IF C% = 1 THEN
  407.         P$ = ""
  408.        ELSE
  409.         P$ = LEFT$(T$, C% - 1)
  410.       END IF
  411.       PUTLINE D%, P$
  412.       CFG(D%).LIN = L% + 1
  413.       INSLINE D%, MID$(T$, C%)
  414.       CFG(D%).CRS = 1
  415.        CASE -61, -38                                       '__ALT/L or F3*
  416.       SAVEQRY D%
  417.       LOADDOC D%
  418.       GOTO CYCLE
  419.        CASE -60, -31                                       '__ALT/S or F2*
  420.       SAVEDOC D%
  421.      CASE 27, -45                       '__ESCAPE or CTRL/X : exit editor*
  422.       EDIT$ = "NO"
  423.        CASE -94                         '__CTRL/F1 : switch to Document 1*
  424.       IF DOC$(1) = "" THEN DOC$(1) = "text1.txt"
  425.       EDDOC% = 1
  426.       GOTO CYCLE
  427.        CASE -95                         '__CTRL/F2 : switch to Document 2*
  428.       IF DOC$(2) = "" THEN DOC$(2) = "text2.txt"
  429.       EDDOC% = 2
  430.       GOTO CYCLE
  431.        CASE -96                                                '__CTRL/F3*
  432.       CLIPBOARD
  433.      CASE 25                                                    '__CTRL/Y*
  434.       DOC$(6) = DELLINE$(D%)
  435.       CFG(D%).CRS = 1
  436.        CASE -71                                                   '__HOME*
  437.       CHECKMARK D%, SH%
  438.       CFG(D%).CRS = 1
  439.       SETMARK D%, SH%
  440.        CASE -79                                                    '__END*
  441.       CHECKMARK D%, SH%
  442.       C% = LEN(RTRIM$(T$)) + 1
  443.       CFG(D%).CRS = -C% * (C% < 81) - 80 * (C% > 80)
  444.       SETMARK D%, SH%
  445.        CASE -119                                             '__CTRL/HOME*
  446.       CHECKMARK D%, SH%
  447.       CFG(D%).CRS = 1
  448.       CFG(D%).LIN = CFG(D%).TOP
  449.       SETMARK D%, SH%
  450.        CASE -117                                              '__CTRL/END*
  451.       CHECKMARK D%, SH%
  452.       C% = CFG(D%).TOP + 23
  453.       T% = CFG(D%).TOT - 1
  454.       IF C% >= T% THEN C% = T%
  455.       CFG(D%).LIN = C%
  456.       T$ = RTRIM$(GETLINE$(D%))
  457.       T% = LEN(T$)
  458.       CFG(D%).CRS = T% - (T% < 80)
  459.       SETMARK D%, SH%
  460.        CASE -132                                          '__CTRL/PAGE UP*
  461.       CHECKMARK D%, SH%
  462.       CFG(D%).TOP = 0
  463.       CFG(D%).LIN = 0
  464.       CFG(D%).CRS = 1
  465.       SETMARK D%, SH%
  466.        CASE -118                                        '__CTRL/PAGE DOWN*
  467.       CHECKMARK D%, SH%
  468.       C% = CFG(D%).TOT
  469.       CFG(D%).TOP = -(C% - 24) * (C% > 23)
  470.       CFG(D%).LIN = C% - 1
  471.       CFG(D%).CRS = 1
  472.       SETMARK D%, SH%
  473.        CASE -73                                                '__PAGE UP*
  474.       CHECKMARK D%, SH%
  475.       IF L% = 0 THEN GOTO CYCLE
  476.       C% = L% - 24
  477.       CFG(D%).LIN = -C% * (C% >= 0)
  478.       C% = CFG(D%).TOP - 24
  479.       CFG(D%).TOP = -C% * (C% >= 0)
  480.       SETMARK D%, SH%
  481.        CASE -81                                              '__PAGE DOWN*
  482.       CHECKMARK D%, SH%
  483.       T% = CFG(D%).TOT - 1
  484.       P% = T% - 23
  485.       L% = CFG(D%).LIN + 24
  486.       IF L% > (T% + 23) THEN GOTO CYCLE
  487.       IF L% > T% THEN L% = T%
  488.       CFG(D%).LIN = L%
  489.       L% = CFG(D%).TOP + 24
  490.       IF L% > P% THEN L% = P%
  491.       CFG(D%).TOP = -L% * (L% >= 0)
  492.       SETMARK D%, SH%
  493.        CASE -72                                                '__CRSR UP*
  494.       CHECKMARK D%, SH%
  495.       L% = L% - 1
  496.       IF L% < 0 THEN GOTO CYCLE
  497.       CFG(D%).LIN = L%
  498.       IF CFG(D%).TOP > L% THEN CFG(D%).TOP = L%
  499.       SETMARK D%, SH%
  500.        CASE -80                                            '__CURSOR DOWN*
  501.       CHECKMARK D%, SH%
  502.       L% = L% + 1
  503.       IF L% >= CFG(D%).TOT THEN GOTO CYCLE
  504.       CFG(D%).LIN = L%
  505.       T% = CFG(D%).TOP
  506.       IF L% > (T% + 23) THEN CFG(D%).TOP = T% + 1
  507.       SETMARK D%, SH%
  508.        CASE -75                                            '__CURSOR LEFT*
  509.       CHECKMARK D%, SH%
  510.       IF C% = 1 THEN GOTO CYCLE
  511.       CFG(D%).CRS = C% - 1
  512.       SETMARK D%, SH%
  513.        CASE -77                                           '__CURSOR RIGHT*
  514.       CHECKMARK D%, SH%
  515.       IF C% > 79 THEN GOTO CYCLE
  516.       CFG(D%).CRS = C% + 1
  517.       SETMARK D%, SH%
  518.        CASE -46                                      '__ALT/C :: CUT TEXT*
  519.       CUTTEXT D%
  520.        CASE -32                                   '__ALT/D :: DELETE TEXT*
  521.       DELETETEXT D%
  522.        CASE -25                                    '__ALT/P :: PASTE TEXT*
  523.       PASTETEXT D%
  524.        CASE -59, -35                               '__ALT/H OR F1 :: HELP*
  525.       HELP
  526.        CASE -115                                             '__CTRL/LEFT*
  527.       CFG(D%).WID = W% + (W% > 10)
  528.        CASE -116                                            '__CTRL/RIGHT*
  529.       CFG(D%).WID = W% - (W% < 79)
  530.     END SELECT
  531.   WEND
  532.   T$ = CHR$(13) + "yn " + CHR$(27)
  533.   SAVEQRY D%
  534.   EDDOC% = -D% * (MSG("Exit KISSED (Y/N)?", T$) > 2)
  535. CYCLE:
  536.   NOISE
  537.   DEF SEG
  538. END FUNCTION
  539.  
  540. FUNCTION GETKEY%
  541.   T$ = ""
  542.   WHILE T$ = ""
  543.     T$ = INKEY$
  544.   WEND
  545.   GETKEY% = ASC(T$)
  546.   IF ASC(T$) = 0 THEN GETKEY% = -ASC(MID$(T$, 2))
  547. END FUNCTION
  548.  
  549. FUNCTION GETLINE$ (D%)
  550.   GETLINE$ = ""
  551.   IF D% = 1 THEN GETLINE$ = D1(CFG(1).LIN).L
  552.   IF D% = 2 THEN GETLINE$ = D2(CFG(2).LIN).L
  553. END FUNCTION
  554.  
  555. FUNCTION GETSTR$ (P$, D$, M%)
  556.   PCOPY 0, 1
  557.   SCREEN , , 1, 1
  558.   L% = 7 + LEN(P$) + M%
  559.   INS% = 1
  560.   Y% = 40 - L% \ 2
  561.   X% = 11
  562.   COLOR 9, 1
  563.   LOCATE X%, Y%
  564.   FOR T% = 1 TO 3
  565.     LOCATE , Y%
  566.     PRINT STRING$(L%, CHR$(176))
  567.   NEXT
  568.   LOCATE X% + 1, Y% + 2
  569.   COLOR 15, 4
  570.   PRINT " "; P$; " ";
  571.   X% = CSRLIN
  572.   Y% = POS(0)
  573.   PRINT SPACE$(M% + 1);
  574.   D$ = LEFT$(D$ + SPACE$(M%), M%)
  575.   B$ = CHR$(29)
  576.   P% = (LEN(RTRIM$(D$)) MOD M%) + 1
  577.   WHILE T% <> 13
  578.     LOCATE , Y%, 0
  579.     COLOR 14, 4
  580.     PRINT D$;
  581.     COLOR 1, 7
  582.     LOCATE , Y% + P% - 1, INS%, 13, 13
  583.     PRINT MID$(D$, P%, 1); B$;
  584.     T% = GETKEY%
  585.     SELECT CASE T%
  586.      CASE 32 TO 127
  587.       IF INS% <> 0 THEN D$ = LEFT$(LEFT$(D$, P%) + MID$(D$, P%), M%)
  588.       MID$(D$, P%) = CHR$(T%)
  589.       IF P% < M% THEN P% = (P% MOD M%) + 1
  590.      CASE 8
  591.       IF P% > 1 THEN MID$(D$, P% - 1) = MID$(D$, P%) + " "
  592.       P% = P% + (P% > 1)
  593.       IF P% = 1 THEN SOUND 1000, .1
  594.      CASE 27
  595.       D$ = ""
  596.       T% = 13
  597.        CASE -82
  598.       INS% = ABS(INS% - 1)
  599.        CASE -83
  600.       MID$(D$, P%) = MID$(D$, P% + 1) + " "
  601.        CASE -75
  602.       P% = ((P% - 2 + M%) MOD M%) + 1
  603.        CASE -77
  604.       P% = (P% MOD M%) + 1
  605.      CASE 25
  606.       D$ = SPACE$(M%)
  607.       P% = 1
  608.        CASE -71
  609.       P% = 1
  610.        CASE -79
  611.       P% = LEN(RTRIM$(D$))
  612.       P% = P% - (P% <> M%)
  613.     END SELECT
  614.   WEND
  615.   SCREEN , , 0, 0
  616.   GETSTR$ = RTRIM$(D$)
  617. END FUNCTION
  618.  
  619. SUB HELP
  620.   SCREEN , , 1, 1
  621.   COLOR 11, 1
  622.   CLS
  623.   T$ = STRING$(80, CHR$(177))
  624.   FOR T% = 1 TO 25
  625.     LOCATE T%, 1
  626.     PRINT T$;
  627.   NEXT
  628.   COLOR 14, 0
  629.   LOCATE 3, 7, 0
  630.   PRINT "____NORMAL KEYS_______________"
  631.   LOCATE , 7
  632.   PRINT " Left Arrow     (Cursor Left) "
  633.   LOCATE , 7
  634.   PRINT " Right Arrow   (Cursor Right) "
  635.   LOCATE , 7
  636.   PRINT " Up Arrow         (Cursor Up) "
  637.   LOCATE , 7
  638.   PRINT " Down Arrow     (Cursor Down) "
  639.   LOCATE , 7
  640.   PRINT " Page Up     (Cursor Page UP) "
  641.   LOCATE , 7
  642.   PRINT " Page Down (Cursor Page Down) "
  643.   LOCATE , 7
  644.   PRINT " Home           (Cursor Home) "
  645.   LOCATE , 7
  646.   PRINT " End             (Cursor End) "
  647.   LOCATE , 7
  648.   PRINT " Insert       (Toggle Insert) "
  649.   LOCATE , 7
  650.   PRINT " Delete              (Delete) "
  651.   LOCATE , 7
  652.   PRINT " F1                    (Help) "
  653.   LOCATE , 7
  654.   PRINT " F2               (Save Text) "
  655.   LOCATE , 7
  656.   PRINT " F3               (Load Text) "
  657.   LOCATE , 7
  658.   PRINT " ESCAPE        (EXIT  EDITOR) "
  659.   LOCATE 19, 7
  660.   PRINT "____SHIFT KEYS________________"
  661.   LOCATE , 7
  662.   PRINT " Insert  (Insert CTRL/Y Line) "
  663.   LOCATE , 7
  664.   PRINT "    Any Cursor movement key   "
  665.   LOCATE , 7
  666.   PRINT "   with SHIFT will mark text. "
  667.   LOCATE 3, 45
  668.   PRINT "____CONTROL KEYS______________"
  669.   LOCATE , 45
  670.   PRINT " F1              (Document 1) "
  671.   LOCATE , 45
  672.   PRINT " F2              (Document 2) "
  673.   LOCATE , 45
  674.   PRINT " F3          (View Clipboard) "
  675.   LOCATE , 45
  676.   PRINT " Home              (Page Top) "
  677.   LOCATE , 45
  678.   PRINT " End            (Page Bottom) "
  679.   LOCATE , 45
  680.   PRINT " Page Up           (Text top) "
  681.   LOCATE , 45
  682.   PRINT " Page Down      (Text Bottom) "
  683.   LOCATE , 45
  684.   PRINT " Left Arrow    (-line length) "
  685.   LOCATE , 45
  686.   PRINT " Right Arrow   (+line length) "
  687.   LOCATE , 45
  688.   PRINT " CTRL/Y         (Delete Line) "
  689.   LOCATE 17, 45
  690.   PRINT "____ALT KEYS__________________"
  691.   LOCATE , 45
  692.   PRINT " ALT/H                 (Help) "
  693.   LOCATE , 45
  694.   PRINT " ALT/C    (Copy To Clipboard) "
  695.   LOCATE , 45
  696.   PRINT " ALT/D   (Delete Marked Text) "
  697.   LOCATE , 45
  698.   PRINT " ALT/P      (Paste ClipBoard) "
  699.   LOCATE , 45
  700.   PRINT " ALT/X                 (EXIT) "
  701.   T% = GETKEY%
  702.   SCREEN , , 0, 0
  703. END SUB
  704.  
  705. SUB INFOBAR (D%)
  706.   P$ = SPACE$(80)
  707.   MID$(P$, 7) = "l" + MID$(STR$(CFG(D%).LIN + 1), 2)
  708.   MID$(P$, 27) = STR$(CFG(D%).TOT) + " lines"
  709.   MID$(P$, 40) = DOC$(D%)
  710.   MID$(P$, 24) = CHR$(64 + D%)
  711.   MID$(P$, 18) = DOC$(CFG(D%).INS + 4)
  712.   MID$(P$, 13) = "w" + MID$(STR$(CFG(D%).WID), 2)
  713.   LOCATE 1, 1
  714.   MID$(P$, 2) = "c" + MID$(STR$(CFG(D%).CRS), 2)
  715.   COLOR 15, 1
  716.   PRINT P$;
  717. END SUB
  718.  
  719. SUB INSLINE (D%, S$)
  720.   L% = CFG(D%).LIN
  721.   IF D% = 1 THEN
  722.     FOR T% = 799 TO L% + 1 STEP -1
  723.       D1(T%).L = D1(T% - 1).L
  724.     NEXT
  725.     D1(CFG(1).LIN).L = S$
  726.   END IF
  727.   IF D% = 2 THEN
  728.     FOR T% = 799 TO L% + 1 STEP -1
  729.       D2(T%).L = D2(T% - 1).L
  730.     NEXT
  731.     D2(CFG(2).LIN).L = S$
  732.   END IF
  733.   IF CFG(D%).TOT < 800 THEN CFG(D%).TOT = CFG(D%).TOT + 1
  734.   SHOWDOC D%
  735. END SUB
  736.  
  737. SUB LINECAT (D%, L%)
  738.   R% = CFG(D%).LIN
  739.   CFG(D%).LIN = L% + 1
  740.   P$ = RTRIM$(GETLINE$(D%))
  741.   C% = CFG(D%).CRS
  742.   CFG(D%).LIN = L%
  743.   T$ = GETLINE$(D%)
  744.   IF R% = L% THEN T$ = LEFT$(T$, C% - 1)
  745.   IF R% <> L% THEN
  746.     T$ = RTRIM$(T$)
  747.     CFG(D%).CRS = LEN(T$) + 1
  748.   END IF
  749.   T$ = T$ + P$
  750.   T% = LEN(T$)
  751.   IF T% < 80 THEN P$ = DELLINE$(D%)
  752.   IF LEN(T$) > 79 THEN
  753.     CFG(D%).LIN = L% + 1
  754.     PUTLINE D%, MID$(T$, 80)
  755.   END IF
  756.   CFG(D%).LIN = L%
  757.   PUTLINE D%, LEFT$(T$, 79)
  758.   SHOWDOC D%
  759. END SUB
  760.  
  761. SUB LOADDOC (D%)
  762.   DN$ = GETSTR$("Load File?", "", 32)
  763.   IF DN$ <> "" THEN DOCOPN DN$, D%
  764. END SUB
  765.  
  766. FUNCTION MSG% (M$, P$)
  767.   M% = LEN(M$)
  768.   P$ = UCASE$(P$)
  769.   PCOPY 0, 1
  770.   SCREEN , , 1, 1
  771.   IF P$ = "" THEN P$ = CHR$(13) + CHR$(27) + " "
  772.   WHILE INKEY$ <> ""
  773.   WEND
  774.   C% = 37 - (M% + 1) \ 2
  775.   LOCATE 10, C%
  776.   COLOR 9, 1
  777.   LOCATE 11, C%, 0
  778.   PRINT STRING$(M% + 6, CHR$(176))
  779.   LOCATE , C%
  780.   PRINT CHR$(176); CHR$(176);
  781.   COLOR 14, 4
  782.   PRINT " "; M$; " ";
  783.   COLOR 9, 1
  784.   PRINT CHR$(176); CHR$(176)
  785.   LOCATE , C%
  786.   PRINT STRING$(M% + 6, CHR$(176))
  787.   ALARM
  788.   T% = 0
  789.   WHILE INSTR(P$, UCASE$(CHR$(T%))) < 1
  790.     T% = GETKEY%
  791.   WEND
  792.   SCREEN , , 0, 0
  793.   MSG% = INSTR(P$, UCASE$(CHR$(T%)))
  794. END FUNCTION
  795.  
  796. SUB NOISE
  797.   SOUND 1000, .1
  798. END SUB
  799.  
  800. SUB ORDERMARK (D%, LA%, LZ%, CA%, CZ%)
  801.   CA% = CFG(D%).MCA
  802.   LA% = CFG(D%).MLA
  803.   CZ% = CFG(D%).MCZ
  804.   LZ% = CFG(D%).MLZ
  805.   LA& = LA%
  806.   LZ& = LZ%
  807.   LA& = LA& * 80 + CA%
  808.   LZ& = LZ& * 80 + CZ%
  809.   IF LA& > LZ& THEN
  810.     SWAP LA%, LZ%
  811.     SWAP CA%, CZ%
  812.   END IF
  813. END SUB
  814.  
  815. SUB PARMSINIT (D%)
  816.   CFG(D%).INS = 1
  817.   CFG(D%).TOP = 0
  818.   CFG(D%).LIN = 0
  819.   CFG(D%).CRS = 1
  820.   CFG(D%).TOT = 1
  821.   CFG(D%).MLA = 0
  822.   CFG(D%).MCA = 0
  823.   CFG(D%).MLZ = 0
  824.   CFG(D%).MCZ = 0
  825.   CFG(D%).WID = 70
  826. END SUB
  827.  
  828. SUB PASTETEXT (D%)
  829.   IF CFG(0).TOT = 1 AND RTRIM$(D0(0).L) = "" THEN
  830.     T% = MSG%("No text in Clipboard", "")
  831.     EXIT SUB
  832.   END IF
  833.   L% = CFG(D%).LIN
  834.   R% = L%
  835.   C% = CFG(D%).CRS
  836.   CFG(D%).MCA = 0
  837.   O% = CFG(0).TOT
  838.   I% = O% - 1
  839.   E% = CFG(D%).TOT
  840.   IF (C% > 1) AND (I% = 0) THEN
  841.     T$ = GETLINE$(D%) + SPACE$(80)
  842.     T$ = RTRIM$(LEFT$(T$, C% - 1) + RTRIM$(D0(0).L) + MID$(T$, C%))
  843.     PUTLINE D%, LEFT$(T$, 79)
  844.     IF LEN(T$) > 79 AND L% < 799 THEN
  845.       CFG(D%).LIN = L% + 1
  846.       INSLINE D%, MID$(T$, 80)
  847.       CFG(D%).LIN = L%
  848.     END IF
  849.     NOISE
  850.     EXIT SUB
  851.   END IF
  852.   FOR T% = 799 TO L% STEP -1
  853.     IF T% - 0 >= 0 THEN
  854.       IF D% = 1 THEN D1(T%).L = D1(T% - O%).L
  855.       IF D% = 2 THEN D2(T%).L = D2(T% - O%).L
  856.     END IF
  857.   NEXT
  858.   FOR T% = 0 TO I%
  859.     IF D% = 1 THEN D1(T% + L%).L = D0(T%).L
  860.     IF D% = 2 THEN D2(T% + L%).L = D0(T%).L
  861.   NEXT
  862.   CFG(D%).TOT = E% + O%
  863.   IF E% + O% > 800 THEN CFG(D%).TOT = 800
  864.   NOISE
  865. END SUB
  866.  
  867. SUB PUTLINE (D%, T$)
  868.   IF D% = 1 THEN D1(CFG(D%).LIN).L = LEFT$(T$ + SPACE$(80), 80)
  869.   IF D% = 2 THEN D2(CFG(D%).LIN).L = LEFT$(T$ + SPACE$(80), 80)
  870. END SUB
  871.  
  872. SUB SAVEDOC (D%)
  873.   ON ERROR GOTO WHATTHE
  874.   DOC$(3) = "ok"
  875.   L% = CFG(D%).LIN
  876.   CFG(D%).LIN = 0
  877.   T% = CFG(D%).TOT
  878.   P$ = RTRIM$(GETLINE$(D%))
  879.   IF P$ = "" AND T% = 1 THEN
  880.     T% = MSG%("No Text", "")
  881.     EXIT SUB
  882.   END IF
  883.   DN$ = DOC$(D%)
  884.   DN$ = GETSTR$("Save As?", DN$, 32)
  885.   IF DN$ = "" THEN
  886.     CFG(D%).LIN = L%
  887.     EXIT SUB
  888.   END IF
  889.   DOC$(D%) = DN$
  890.   OPEN DN$ FOR OUTPUT AS #1
  891.   IF DOC$(3) <> "ok" THEN
  892.     T% = MSG%("File Error :: Hit a Key", "")
  893.    ELSE
  894.     FOR P% = 0 TO T% - 1
  895.       CFG(D%).LIN = P%
  896.       P$ = RTRIM$(GETLINE$(D%))
  897.       IF P$ = "" THEN P$ = " "
  898.       PRINT #1, P$
  899.     NEXT
  900.     CFG(D%).LIN = L%
  901.     ALARM
  902.     CLOSE 1
  903.   END IF
  904. END SUB
  905.  
  906. SUB SAVEQRY (D%)
  907.   L% = CFG(D%).LIN
  908.   CFG(D%).LIN = 0
  909.   T% = CFG(D%).TOT
  910.   CFG(D%).LIN = L%
  911.   P$ = RTRIM$(GETLINE$(D%))
  912.   IF P$ = "" AND T% = 1 THEN
  913.     NOISE
  914.     EXIT SUB
  915.   END IF
  916.   T% = MSG%("Save Current Document (Y:N)?", " ny" + CHR$(13))
  917.   IF T% > 2 THEN
  918.     NOISE
  919.     SAVEDOC D%
  920.    ELSE
  921.     ALARM
  922.   END IF
  923. END SUB
  924.  
  925. SUB SETMARK (D%, SH%)
  926.   IF SH% = 0 THEN EXIT SUB
  927.   L% = CFG(D%).LIN
  928.   C% = CFG(D%).CRS
  929.   L& = L%
  930.   L& = L& * 80 + C%
  931.   A% = CFG(D%).MLA
  932.   A& = A%
  933.   A& = A% * 80 + CFG(D%).MCA
  934.   CFG(D%).MLZ = L%
  935.   CFG(D%).MCZ = C%
  936. END SUB
  937.  
  938. SUB SHOWDOC (D%)
  939.   L% = CFG(D%).LIN
  940.   T% = CFG(D%).TOP
  941.   COLOR 10, 0
  942.   LOCATE , , 0
  943.   IF T% + 23 < L% THEN
  944.     T% = L% - 23
  945.     CFG(D%).TOP = T%
  946.   END IF
  947.   FOR B% = 0 TO 23
  948.     L% = B% + T%
  949.     IF L% > 799 THEN
  950.       LOCATE 2 + B%, 1
  951.       PRINT SPACE$(80);
  952.      ELSE
  953.       SHOWLINE D%, L%, 2 + B%
  954.     END IF
  955.   NEXT
  956. END SUB
  957.  
  958. SUB SHOWLINE (D%, L%, S%)
  959.   LA% = 0
  960.   LZ% = 0
  961.   CA% = 0
  962.   CZ% = 0
  963.   IF CFG(D%).MCA <> 0 THEN ORDERMARK D%, LA%, LZ%, CA%, CZ%
  964.   IF D% = 0 THEN T$ = D0(L%).L + SPACE$(80)
  965.   IF D% = 1 THEN T$ = D1(L%).L + SPACE$(80)
  966.   IF D% = 2 THEN T$ = D2(L%).L + SPACE$(80)
  967.   LOCATE S%, 1
  968.   COLOR 10, 0
  969.   IF CA% = 0 OR (LA% > L%) OR (LZ% < L%) THEN
  970.     PRINT LEFT$(T$, 80);
  971.    ELSE
  972.     IF LA% = LZ% THEN
  973.       IF CA% > 1 THEN PRINT LEFT$(T$, CA% - 1);
  974.       COLOR 0, 3
  975.       PRINT MID$(T$, CA%, CZ% - CA% + 1);
  976.       COLOR 10, 0
  977.       PRINT MID$(T$, CZ% + 1, 80 - CZ%);
  978.      ELSE
  979.       IF (L% > LA%) AND (L% < LZ%) THEN
  980.         COLOR 0, 3
  981.         PRINT LEFT$(T$, 80);
  982.        ELSE
  983.         IF L% = LA% THEN
  984.           IF CA% > 1 THEN PRINT LEFT$(T$, CA% - 1);
  985.           COLOR 0, 3
  986.           PRINT MID$(T$, CA%, 81 - CA%);
  987.          ELSE
  988.           COLOR 0, 3
  989.           PRINT LEFT$(T$, CZ%);
  990.           COLOR 10, 0
  991.           PRINT MID$(T$, CZ% + 1, 80 - CZ%);
  992.         END IF
  993.       END IF
  994.     END IF
  995.   END IF
  996. END SUB
  997.  
  998.